package top.v5it.logback.push.channel.dingtalk;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 钉钉机器人发送消息请求
 *
 * @author zhanpu
 * @date 2021/7/14
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class DingTalkRobotSendRequest implements Serializable {

    private static final long serialVersionUID = -7648616229104708496L;

    /**
     * 消息类型
     */
    private MsgtypeEnum msgtype;

    /**
     * 文本消息
     */
    private Text text;

    /**
     * at联系人
     */
    private At at;

    /**
     * markdown消息
     */
    private Markdown markdown;

    /**
     * link消息
     */
    private Link link;

    /**
     * actionCard消息
     */
    private ActionCard actionCard;

    /**
     * feedCard消息
     */
    private FeedCard feedCard;

    /**
     * 消息类型
     */
    public enum MsgtypeEnum {

        /**
         * text
         */
        text,

        /**
         * markdown
         */
        markdown,

        /**
         * link
         */
        link,

        /**
         * actionCard
         */
        actionCard,

        /**
         * feedCard
         */
        feedCard
    }

    /**
     * text类型
     */
    @Data
    @EqualsAndHashCode(callSuper = false)
    @Accessors(chain = true)
    public static class Text {

        /**
         * 消息内容
         */
        private String content;
    }

    @Data
    @EqualsAndHashCode(callSuper = false)
    @Accessors(chain = true)
    public static class At {

        /**
         * 非必填
         * <p>
         * 被@人的手机号
         * <p>
         * 注意 在content里添加@人的手机号
         */
        private List<String> atMobiles = new ArrayList<>();

        /**
         * 非必填
         * <p>
         * 被@人的用户userid
         */
        private List<String> atUserIds = new ArrayList<>();

        /**
         * 非必填
         * <p>
         * 是否at所有人，true-at所有人
         */
        private boolean isAtAll;
    }

    /**
     * markdown类型
     * 参考
     * <pre>
     *     https://developers.dingtalk.com/document/chatgroup/basic-message-types
     * </pre>
     */
    @Data
    @Accessors(chain = true)
    @EqualsAndHashCode(callSuper = false)
    public static class Markdown {

        /**
         * markdown格式的消息
         */
        private String text;

        /**
         * 首屏会话透出的展示内容
         */
        private String title;

    }

    /**
     * link类型
     */
    @Data
    @Accessors(chain = true)
    @EqualsAndHashCode(callSuper = false)
    public static class Link {

        /**
         * 消息内容。如果太长只会部分展示
         * <p>
         * FeedCard类型时，可非必填
         */
        private String text;

        /**
         * 消息标题
         */
        private String title;

        /**
         * 点击消息跳转的URL
         */
        private String messageUrl;

        /**
         * 非必填
         * <p>
         * 图片URL
         */
        private String picUrl;
    }

    /**
     * 整体/独立跳转ActionCard类型
     */
    @Data
    @Accessors(chain = true)
    @EqualsAndHashCode(callSuper = false)
    public static class ActionCard {

        /**
         * markdown格式的消息
         */
        private String text;

        /**
         * 首屏会话透出的展示内容
         */
        private String title;

        /**
         * 单个按钮的标题
         * <p>
         * 注意 设置此项和singleURL后，btns无效
         * </p>
         */
        private String singleTitle;

        /**
         * 点击singleTitle按钮触发的URL
         */
        private String singleURL;

        /**
         * 非必填
         * <p>
         * 0：按钮竖直排列
         * <p>
         * 1：按钮横向排列
         */
        private String btnOrientation;

        /**
         * 按钮
         */
        private List<Btn> btns = new ArrayList<>();

        @Data
        @Accessors(chain = true)
        @EqualsAndHashCode(callSuper = false)
        public static class Btn {

            /**
             * 按钮标题
             */
            private String title;

            /**
             * 点击按钮触发的URL
             */
            private String actionURL;
        }

    }

    /**
     * FeedCard类型
     */
    @Data
    @Accessors(chain = true)
    @EqualsAndHashCode(callSuper = false)
    public static class FeedCard {

        private List<Link> links = new ArrayList<>();

    }
}
